(() => {
  class Person {
    name: string;
    age: number;
    constructor(name: string, age: number) {
      this.name = name;
      this.age = age;
    }
  }

  let per = new Person("孙悟空", 18);
  console.log("per", per);
  per.name = "猪八戒";
  per.age = -18;
  console.log("per", per); //可以任意修改 年龄能有负数嘛？
  /**
   * 上面的属性是在对象中设置的，属性可以任意的被修改
   *  属性可以任意被修改将会导致对象中的数据会变得非常不安全
   */
  class Animal {
    /**q
     * 可以在属性前添加修饰符
     */
    public _name: string; //公共属性可以在任意位置 包括子类 (访问)更改  默认就是public
    private _age: number; //私有属性 只能在类内部(访问)修改
    //protected   受保护的属性，只能在当前类和当前类的子类中访问
    constructor(name: string, age: number) {
      this._name = name;
      this._age = age;
    }
    // //getter 添加方法让私有属性可以在外部访问
    // getAge() {
    //   return this.age;
    // }
    // //setter 设置属性
    // setAge(value: number) {
    //   if (value > 0) {
    //     this.age = value;
    //   }
    // }

    //ts中设置获取属性 设置属性 的方法  不会改变访问数据的方法
    /**
     * 不是特别复杂的修改时  一般用不到
     */
    get age() {
      return this._age;
    }
    set age(value: number) {
      if (value > 0) {
        this._age = value;
      }
    }
  }
  let dog = new Animal("旺财", 2);
  // console.log("dog", dog);
  // console.log("dog.getAge()", dog.getAge());
  // dog.setAge(-8);
  console.log("dog.age", dog.age);
  // console.log("dog", dog); //改不了
  dog.age = 8;
  console.log("dog", dog);

  /**
   * 语法糖
   */

  class C {
    //得用public
    constructor(public name: string, public age: number) {}
  }
  let c = new C("666", 6);
  console.log("c", c);
})();
